|
|
(******************************************************************************)
(**) ОТДЕЛ ПроLL+;
(******************************************************************************
* НАЗНАЧЕНИЕ:
* разложение симметрической положительно определенной матрицы A на две
* треугольные матрицы L и L', где L - это нижняя треугольная матрица,
* а L' - матрица, транспонированная к L
*
* ПРИМЕЧАНИЯ:
* Исходная матрица записана в файле "ПроМатр4.дан".
* В этом файле 1-я строка содержит размер матрицы (число строк и столбцов),
* а последующие строки содержат значения элементов матрицы.
******************************************************************************)
ИСПОЛЬЗУЕТ
Матем ИЗ "...\Отделы\Числа\",
Матр ИЗ "...\Отделы\Числа\",
МатрВВ ИЗ "...\Отделы\Числа\",
Читать ИЗ "...\Отделы\Обмен\",
Вывод ИЗ "...\Отделы\Обмен\";
(******************************************************************************)
ЗАДАЧА Перемножить(L-,A+:Матр.Вид); (* A=L*L' *)
ПЕР
i,j,k,n:ЦЕЛ;
m:Матем.Вещ;
УКАЗ
n:=РАЗМЕР(L);
ОТ i:=0 ДО n-1 ВЫП
ОТ j:=0 ДО i ВЫП
m:=0;
ОТ k:=0 ДО j ВЫП
m:=m+L[i,k]*L[j,k]
КОН;
A[i,j]:=m;
ЕСЛИ i # j ТО
A[j,i]:=m
КОН
КОН
КОН
КОН Перемножить;
(******************************************************************************)
ЗАДАЧА Голова;
ПЕР
n:ЦЕЛ; (* размер матрицы *)
A:Матр.Доступ; (* исходная матрица *)
L:Матр.Доступ; (* матрица L *)
п:Читать.Поток;
УКАЗ
п:=МатрВВ.ОткрытьПоток("ПроМатр4.дан");
A:=МатрВВ.ЧитатьМатр(п);
Читать.Закрыть(п);
n:=РАЗМЕР(A^);
СОЗДАТЬ(L,n,n);
Вывод.Цепь("^Исходная матрица:^");
МатрВВ.ВыводМатр("%10.5f",A^);
ЕСЛИ Матр.РазложитьНаLL(A^,L^) = 0 ТО
Вывод.Цепь("^L матрица:^");
МатрВВ.ВыводМатр("%10.5f",L^);
Перемножить(L^,A^);
Вывод.Цепь("^L*L' матрица:^");
МатрВВ.ВыводМатр("%10.5f",A^)
ИНАЧЕ
Вывод.Цепь("^Матрица не является положительно определённой!^")
КОН
КОН Голова;
(******************************************************************************)
УКАЗ
Голова
КОН ПроLL.
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|